package com.example.demo.util;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

//功能是从一个源文件夹中读取所有文件，将所有文件的内容按照一定的行数（例如1000行）进行划分，并将划分后的内容写入到新的文件中，新的文件保存在目标文件夹中，文件名为"数字-时间"的格式。
public class FileProcessor {

    // 源文件夹路径
    private static final String SOURCE_DIRECTORY = "E:\\2023101822点39分文章\\原始文字 - 副本";
    // 目标文件夹路径
    private static final String TARGET_DIRECTORY = "E:\\2023101822点39分文章\\上传服务器最终版";
    // 每个文件的行数
    private static final int LINES_PER_FILE = 1000;
    // 时间格式化工具
    private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyyMMddHHmmss");

    public static void main(String[] args) throws IOException {
        FileProcessor processor = new FileProcessor();
        // 执行文件处理
        processor.processFiles();
    }

    // 处理文件的主要方法
    private void processFiles() throws IOException {
        // 创建源文件夹的File对象
        File sourceDir = new File(SOURCE_DIRECTORY);
        // 获取源文件夹中的所有文件
        File[] files = sourceDir.listFiles();
        if (files == null) {
            System.out.println("No files found in the source directory.");
            return;
        }

        // 按照文件名中"-"前的数字进行排序
        Arrays.sort(files, Comparator.comparingInt(this::getNumberBeforeDash));

        // 存储所有文件的所有行
        List<String> allLines = new ArrayList<>();
        for (File file : files) {
            // 读取文件的所有行，并添加到allLines中
            allLines.addAll(Files.readAllLines(file.toPath()));
        }

        // 将allLines划分为每个子列表包含1000行的多个子列表
        List<List<String>> chunks = IntStream.range(0, (allLines.size() + LINES_PER_FILE - 1) / LINES_PER_FILE)
                .mapToObj(i -> allLines.subList(i * LINES_PER_FILE, Math.min(LINES_PER_FILE * (i + 1), allLines.size())))
                .collect(Collectors.toList());

        // 将每个子列表写入到新的文件中，文件保存在目标文件夹中，文件名为"数字-时间"的格式
        for (int i = 0; i < chunks.size(); i++) {
            // 生成时间戳
            String timestamp = DATE_FORMAT.format(new Date());
            // 创建目标文件的File对象，文件名为"数字-时间"的格式
            File targetFile = new File(TARGET_DIRECTORY, (i + 1) + "-" + timestamp + ".txt");
            // 将子列表的内容写入到目标文件中
            Files.write(targetFile.toPath(), chunks.get(i));
        }
    }

    // 获取文件名中"-"前的数字
    private int getNumberBeforeDash(File file) {
        String name = file.getName();
        int dashIndex = name.indexOf("-");
        if (dashIndex == -1) {
            return Integer.MAX_VALUE; // 如果没有"-"，则返回一个很大的数
        }
        String numberString = name.substring(0, dashIndex);
        try {
            return Integer.parseInt(numberString);
        } catch (NumberFormatException e) {
            return Integer.MAX_VALUE; // 如果数字不能被解析，也返回一个很大的数
        }
    }
}
